//初始化alpha环境。

{
	__funcs = [];

	Function.prototype.closure = function() {
	    __funcs.push(this);
		var idx = __funcs.length - 1;
	    return function () {
			return __funcs[idx].apply(this, arguments);
	    };
	};
	

	loadSysJS('private/jquery.js');
	
	al_jQuery_event_add = jQuery.event.add;
	jQuery.event.add = function(element, type, handler, data){
		al_jQuery_event_add.apply(this, [element, type, handler.closure(), data]);
	}
	
	//loadSysJS('private/jsonrpc.js');
	//var jsonrpc = new JSONRpcClient("?_JSON_RPC_=JSON-RPC");	//jsonrpc.serverURL

	loadSysJS("private/alpha-utils.js");
	loadSysJS("private/alpha-action.js");
	loadSysJS("private/alpha-component.js");
	
	//load css
	loadSysCSS("base.css");

	//跨浏览器兼容支持。
	if(!isIE()){  //非IE浏览器
		XMLDocument.prototype.loadXML = function(xmlString){
			    var childNodes = this.childNodes;
			    for (var i = childNodes.length - 1; i >= 0; i--)
			        this.removeChild(childNodes[i]);
			
			    var dp = new DOMParser();
			    var newDOM = dp.parseFromString(xmlString, "text/xml");
			    var newElt = this.importNode(newDOM.documentElement, true);
			    this.appendChild(newElt);
			};
		XMLDocument.prototype.__defineGetter__('xml', function() {
			     var oSerializer = new XMLSerializer();
			     return oSerializer.serializeToString(this);
			});
		Element.prototype.__defineGetter__('xml', function() {
		     var oSerializer = new XMLSerializer();
		     return oSerializer.serializeToString(this);
		});
		Text.prototype.__defineGetter__('xml', function() {
			return this.nodeValue;
		});
		XMLDocument.prototype.__defineGetter__('text', function() {
				var oNode = this;
				var sText = "";
				for (var i = 0; i < oNode.childNodes.length; i++) {
				    if (oNode.childNodes[i].hasChildNodes()) {
				        sText += oNode.childNodes[i].text;
				    } else {
				        sText += oNode.childNodes[i].nodeValue;
				    }
				}
				return sText;
			});
		Element.prototype.__defineGetter__('text', function() {
				var oNode = this;
				var sText = "";
			     for (var i = 0; i < oNode.childNodes.length; i++) {
			        if (oNode.childNodes[i].hasChildNodes()) {
			            sText += oNode.childNodes[i].text;
			        } else {
			            sText += oNode.childNodes[i].nodeValue;
			        }
			     }
			     return sText;
			});
		Text.prototype.__defineGetter__('text', function() {
				return this.nodeValue;
			})
		XMLDocument.prototype.selectNodes = function(cXPathString, xNode){
			    if( !xNode )
			        { xNode = this; } 
			    var oNSResolver = this.createNSResolver(this.documentElement)
			    var aItems = this.evaluate(cXPathString, xNode, oNSResolver, 
			    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
			    var aResult = [];
			    for( var i = 0; i < aItems.snapshotLength; i++)
			    {
			        aResult.push(aItems.snapshotItem(i));
			    }
			    return aResult;
			};
		XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode){
				if( !xNode ) { xNode = this; } 
		        var xItems = this.selectNodes(cXPathString, xNode);
		        if( xItems.length > 0 )
		        {
		           return xItems[0];
		        }
		        else
		        {
		             return null;
		        }
			};
		Element.prototype.selectNodes = function(cXPathString){
			    if(this.ownerDocument.selectNodes)
			    {
			        return this.ownerDocument.selectNodes(cXPathString, this);
			    }
			    else
			    {
			        throw "For XML Elements Only";
			    }
			};
		Element.prototype.selectSingleNode = function(cXPathString){
			    if(this.ownerDocument.selectSingleNode)
		        {
		           return this.ownerDocument.selectSingleNode(cXPathString, this);
		        }
		        else{throw "For XML Elements Only";}
			};
			
		if(window.Event){// 修正Event的DOM
		    /*
		                           IE5   MacIE5   Mozilla  Konqueror2.2  Opera5
		    event                  yes   yes      yes      yes           yes
		    event.returnValue      yes   yes      no       no            no
		    event.cancelBubble     yes   yes      no       no            no
		    event.srcElement       yes   yes      no       no            no
		    event.fromElement      yes   yes      no       no            no
		    
		    */
		    window.constructor.prototype.__defineGetter__("event", function(){
		    		func=arguments.callee.caller;
					while(func!=null)
					{
						var arg0=func.arguments[0];
						if(arg0 && (arg0.constructor == Event || arg0.constructor == MouseEvent))
						{
							return arg0;
						}
						func=func.caller;
					}
					return null;
		    	});
		    	
		    Event.prototype.__defineSetter__("returnValue",function(b){// 
		        if(!b)this.preventDefault();
		        return b;
		        });
		    Event.prototype.__defineSetter__("cancelBubble",function(b){// 设置或者检索当前事件句柄的层次冒泡
		        if(b)this.stopPropagation();
		        return b;
		        });
		    Event.prototype.__defineGetter__("srcElement",function(){
		        var node=this.target;
		        while(node.nodeType!=1)node=node.parentNode;
		        return node;
		        });
		    Event.prototype.__defineGetter__("fromElement",function(){// 返回鼠标移出的源节点
		        var node;
		        if(this.type=="mouseover")
		            node=this.relatedTarget;
		        else if(this.type=="mouseout")
		            node=this.target;
		        if(!node)return;
		        while(node.nodeType!=1)node=node.parentNode;
		        return node;
		        });
		    Event.prototype.__defineGetter__("toElement",function(){// 返回鼠标移入的源节点
		        var node;
		        if(this.type=="mouseout")
		            node=this.relatedTarget;
		        else if(this.type=="mouseover")
		            node=this.target;
		        if(!node)return;
		        while(node.nodeType!=1)node=node.parentNode;
		        return node;
		        });
		    Event.prototype.__defineGetter__("offsetX",function(){
		        return this.layerX;
		        });
		    Event.prototype.__defineGetter__("offsetY",function(){
		        return this.layerY;
		        });
		    }
		if(window.Document){// 修正Document的DOM
		    /*
		                              IE5  MacIE5  Mozilla  Konqueror2.2  Opera5
		    document.documentElement  yes  yes     yes      yes           no
		    document.activeElement    yes  null    no       no            no
		    
		    */
		    }
		if(window.Node){// 修正Node的DOM
		    /*
		                        IE5  MacIE5  Mozilla  Konqueror2.2  Opera5
		    Node.contains       yes  yes     no       no            yes
		    Node.replaceNode    yes  no      no       no            no
		    Node.removeNode     yes  no      no       no            no
		    Node.children       yes  yes     no       no            no
		    Node.hasChildNodes  yes  yes     yes      yes           no
		    Node.childNodes     yes  yes     yes      yes           no
		    Node.swapNode       yes  no      no       no            no
		    Node.currentStyle   yes  yes     no       no            no
		    
		    */
		    Node.prototype.replaceNode=function(Node){// 替换指定节点
		        this.parentNode.replaceChild(Node,this);
		        }
		    Node.prototype.removeNode=function(removeChildren){// 删除指定节点
		        if(removeChildren)
		            return this.parentNode.removeChild(this);
		        else{
		            var range=document.createRange();
		            range.selectNodeContents(this);
		            return this.parentNode.replaceChild(range.extractContents(),this);
		            }
		        }
		    Node.prototype.swapNode=function(Node){// 交换节点
		        var nextSibling=this.nextSibling;
		        var parentNode=this.parentNode;
		        node.parentNode.replaceChild(this,Node);
		        parentNode.insertBefore(node,nextSibling);
		        }
		    }
		if(window.HTMLElement){
		    HTMLElement.prototype.__defineGetter__("all",function(){
		        var a=this.getElementsByTagName("*");
		        var node=this;
		        a.tags=function(sTagName){
		            return node.getElementsByTagName(sTagName);
		            }
		        return a;
		        });
		    HTMLElement.prototype.__defineGetter__("parentElement",function(){
		        if(this.parentNode==this.ownerDocument)return null;
		        return this.parentNode;
		        });
		    HTMLElement.prototype.__defineGetter__("children",function(){
		        var tmp=[];
		        var j=0;
		        var n;
		        for(var i=0;i<this.childNodes.length;i++){
		            n=this.childNodes[i];
		            if(n.nodeType==1){
		                tmp[j++]=n;
		                if(n.name){
		                    if(!tmp[n.name])
		                        tmp[n.name]=[];
		                    tmp[n.name][tmp[n.name].length]=n;
		                    }
		                if(n.id)
		                    tmp[n.id]=n;
		                }
		            }
		        return tmp;
		        });
		    HTMLElement.prototype.__defineGetter__("currentStyle", function(){
		        return this.ownerDocument.defaultView.getComputedStyle(this,null);
		        });
		    HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML){
		        var r=this.ownerDocument.createRange();
		        r.setStartBefore(this);
		        var df=r.createContextualFragment(sHTML);
		        this.parentNode.replaceChild(df,this);
		        return sHTML;
		        });
		    HTMLElement.prototype.__defineGetter__("outerHTML",function(){
		        var attr;
		        var attrs=this.attributes;
		        var str="<"+this.tagName;
		        for(var i=0;i<attrs.length;i++){
		            attr=attrs[i];
		            if(attr.specified)
		                    str+=" "+attr.name+'="'+attr.value+'"';
		            }
		        if(!this.canHaveChildren)
		            return str+">";
		        return str+">"+this.innerHTML+"</"+this.tagName+">";
		        });
		    HTMLElement.prototype.__defineGetter__("canHaveChildren",function(){
		        switch(this.tagName.toLowerCase()){
		            case "area":
		            case "base":
		            case "basefont":
		            case "col":
		            case "frame":
		            case "hr":
		            case "img":
		            case "br":
		            case "input":
		            case "isindex":
		            case "link":
		            case "meta":
		            case "param":
		                    return false;
		            }
		        return true;
		        });
		    HTMLElement.prototype.__defineSetter__("innerText",function(sText){
		        //var parsedText=document.createTextNode(sText);
		        //this.innerHTML=parsedText;
		        //return parsedText;
		        this.innerHTML = sText;
		        return sText;
		        });
		    HTMLElement.prototype.__defineGetter__("innerText",function(){
		        var r=this.ownerDocument.createRange();
		        r.selectNodeContents(this);
		        return r.toString();
		        });
		    HTMLElement.prototype.__defineSetter__("outerText",function(sText){
		        var parsedText=document.createTextNode(sText);
		        this.outerHTML=parsedText;
		        return parsedText;
		        });
		    HTMLElement.prototype.__defineGetter__("outerText",function(){
		        var r=this.ownerDocument.createRange();
		        r.selectNodeContents(this);
		        return r.toString();
		        });
		    HTMLElement.prototype.attachEvent=function(sType,fHandler){
		        var shortTypeName=sType.replace(/on/,"");
		        fHandler._ieEmuEventHandler=function(e){
		            window.event=e;
		            return fHandler();
		            }
		        this.addEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
		        }
		    HTMLElement.prototype.detachEvent=function(sType,fHandler){
		        var shortTypeName=sType.replace(/on/,"");
		        if(typeof(fHandler._ieEmuEventHandler)=="function")
		            this.removeEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
		        else
		            this.removeEventListener(shortTypeName,fHandler,true);
		        }
		    HTMLElement.prototype.contains=function(Node){// 是否包含某节点
		        do if(Node==this)return true;
		        while(Node=Node.parentNode);
		        return false;
		        }
		    HTMLElement.prototype.insertAdjacentElement=function(where,parsedNode){
		        switch(where){
		            case "beforeBegin":
		                    this.parentNode.insertBefore(parsedNode,this);
		                    break;
		            case "afterBegin":
		                    this.insertBefore(parsedNode,this.firstChild);
		                    break;
		            case "beforeEnd":
		                    this.appendChild(parsedNode);
		                    break;
		            case "afterEnd":
		                    if(this.nextSibling)
		                            this.parentNode.insertBefore(parsedNode,this.nextSibling);
		                    else
		                            this.parentNode.appendChild(parsedNode);
		                    break;
		            }
		        }
		    HTMLElement.prototype.insertAdjacentHTML=function(where,htmlStr){
		        var r=this.ownerDocument.createRange();
		        r.setStartBefore(this);
		        var parsedHTML=r.createContextualFragment(htmlStr);
		        this.insertAdjacentElement(where,parsedHTML);
		        }
		    HTMLElement.prototype.insertAdjacentText=function(where,txtStr){
		        var parsedText=document.createTextNode(txtStr);
		        this.insertAdjacentElement(where,parsedText);
		        }
		    HTMLElement.prototype.attachEvent=function(sType,fHandler){
		        var shortTypeName=sType.replace(/on/,"");
		        fHandler._ieEmuEventHandler=function(e){
		            window.event=e;
		            return fHandler();
		            }
		        this.addEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
		        }
		    HTMLElement.prototype.detachEvent=function(sType,fHandler){
		        var shortTypeName=sType.replace(/on/,"");
		        if(typeof(fHandler._ieEmuEventHandler)=="function")
		            this.removeEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
		        else
		            this.removeEventListener(shortTypeName,fHandler,true);
		        }
		}
	}
}